/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Logistica.Controlador;

import com.dp1.pucp.Modelo.Clases.*;
import com.dp1.pucp.Logistica.DAO.*;
import com.dp1.pucp.Logistica.Vista.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JTable;
import javax.swing.table.TableModel;

/**
 *
 * @author ubuntu64
 */
public class AceptarPedidoProductoControlador {
    private TipoProductoDAO m;
    private AceptarPedidoProductoGUI2 aceptarPedidoProductoView;
    private ArrayList<Pedidoproducto> lstPedidoProducto;
    private ArrayList<Pedidoproducto> lstNuevoPedido;
    private ArrayList<Lineapedidoproducto> lstLineaPedidoProducto;
    private ArrayList<String> lstTipo;
   
    private TableModel table;
    private final static int ESTADO_ACTIVO=1;
    private final static int ESTADO_INACTIVO=0;
    private final static int FINALIZADO=4;
        
    public AceptarPedidoProductoControlador(TipoProductoDAO dao, AceptarPedidoProductoGUI2 v){
        m = dao;
        aceptarPedidoProductoView = v;
        
        table= aceptarPedidoProductoView.getTable();
        aceptarPedidoProductoView.addBuscarListener(new listarPedidos() );
        aceptarPedidoProductoView.addHallarMPListener(new HallarMPListener(this));

    }
    
    public void listarResultados(Date fechaini,Date fechafin){
        lstPedidoProducto = m.listarPedidoProducto(fechaini,fechafin);               
        aceptarPedidoProductoView.llenaGrilla(lstPedidoProducto);        
    }
    
    public void ActualizarResultados(ArrayList<Pedidoproducto> pedidoProducto){
        //lstPedidoProducto = m.listarPedidoProducto();               
        aceptarPedidoProductoView.llenaGrilla(pedidoProducto);        
    }
    
    class HallarMPListener implements ActionListener {
        
        private AceptarPedidoProductoControlador buc;
        public HallarMPListener(AceptarPedidoProductoControlador buscarusr){
            buc=buscarusr;
        }
                
        @Override
        public void actionPerformed(ActionEvent e) {
            int fil=table.getRowCount();
            int col=table.getColumnCount();
            ArrayList<Lineapedidoproducto> difLineaPedido=new ArrayList<>();
            //int sel=aceptarPedidoProductoView.getFilaSel();
            
            //if (sel!=-1){
                //AlmacenGUI p = new AlmacenGUI(aceptarPedidoProductoView.getPadre(), true);
                ArrayList<Pedidoproducto> u = lstPedidoProducto;//todos los pedidos
                ArrayList<Lineapedidoproducto> nuevoLineaPedido=new ArrayList<>();
                //nuevoLineaPedido.add(l.get(j));
                
                //para cada , aca sacar todos los pedidos de esa busqueda por fechas (rango)
                for(int i=0;i<fil;i++){
                    int codPedido=u.get(i).getIdpedidoproducto();
                    
                    //para cada linea de pedido,saco todas las lineas de ese pedido y
                    //acumulo cantidades para ese producto en esa presentacion en el nuevo arreglo
                    
                    ArrayList<Lineapedidoproducto> l=m.listarLineaPedidoProducto(codPedido);//buscar todas las lineas para ese codigo de pedido
                    if(nuevoLineaPedido.isEmpty()) nuevoLineaPedido.add(l.get(0));
                        
                        //primero busco si ta en el nuevoArreglo
                        for(int j=0;j<l.size();j++){
                            
                            int CodPres=l.get(j).getPresentacion().getIdpresentacion();
                            int CodProd=l.get(j).getTipoproducto().getIdtipoproducto();
                            float cant=l.get(j).getCantidad();   
                            
                            for(int k=0;k<nuevoLineaPedido.size();k++){
                            //verifico que este codPres en tal codProd no este en la nueva lista
                                    
                                    if((nuevoLineaPedido.get(k).getTipoproducto().getIdtipoproducto()==CodProd)
                                    &&(nuevoLineaPedido.get(k).getPresentacion().getIdpresentacion()==CodPres)){
                                //si hay igual tipo producto con determinada presentacion, se acumula
                                //le sumo la cantidad de la linea l     
                                        if(j>0){
                                        float cantAntigua=nuevoLineaPedido.get(j-1).getCantidad();
                                        float sum=cant+cantAntigua;
                                        if(nuevoLineaPedido.size()==100)
                                        nuevoLineaPedido.get(k).setCantidad(cantAntigua);
                                        else
                                        nuevoLineaPedido.get(k).setCantidad(sum);
                                        }
                                        //if(k==0) nuevoLineaPedido.add(l.get(0));
                                    }

                                    else{//sino lo encuentro agrego ese objeto a mi arreglo nuevo
                                        nuevoLineaPedido.add(l.get(j));
                                        break;
                                
                                    }
                               
                            }
                        }
       
                }
                
                int x;
                int y;
                //ahora que tengo todos los productos necesarios para  este pedido de producto
                //saco todo lo que tengo en almacen de producto finales
                ArrayList<Productofinal> q=m.listarProductoFinales();//despues filtrar por lote o fecha
                
                
                //Ahora por cada linea que tengo en nuevoLineaPedido, esta es buscada en q, y se saca su diferencia
                for(y=0;y<nuevoLineaPedido.size();y++){
                    int encontrado=0;
                    
                    for(x=0;x<q.size();x++){
                            int CodPresPF=q.get(x).getPresentacion().getIdpresentacion();
                            int CodProdPF=q.get(x).getTipoproducto().getIdtipoproducto();
                            float cantPF=q.get(x).getCantidad();
                            //float cantDif=nuevoLineaPedido.get(y).getCantidad()-cantPF;
                            
                             if((nuevoLineaPedido.get(y).getTipoproducto().getIdtipoproducto()==CodProdPF)
                                    &&(nuevoLineaPedido.get(y).getPresentacion().getIdpresentacion()==CodPresPF)){
                                   
                                   encontrado=1;
                                   break;
                                   //int variableY=y;
                                   //break;//una vez que lo encuentre esa pres y tipo le hago break  
                            }
   
                    }
                    if(encontrado==1){
                        float cantPF=q.get(x).getCantidad();//el x salio con un valor
                        float cantDif=nuevoLineaPedido.get(y).getCantidad()-cantPF;
                        if(cantDif>0){
                            //estoy guardando solo las lineas de pedidos en la cual lo necesario sea mayor a lo que tengo
                            //en almacen
                             nuevoLineaPedido.get(y).setCantidad(cantDif);
                             difLineaPedido.add(nuevoLineaPedido.get(y));
                        }
                    }
                   if(encontrado==0){
                       //si no lo encuentro lo agrego directamente porque necesito esa linea 
                            difLineaPedido.add(nuevoLineaPedido.get(y));
                   } 
                    
                }
                
                if(difLineaPedido.size()!=0){
                DetalleMateriaPrimaNecesariaGUI p = new DetalleMateriaPrimaNecesariaGUI(aceptarPedidoProductoView.getPadre(), true);
                DetalleMateriaPrimaNecesariaControlador c = new DetalleMateriaPrimaNecesariaControlador (m,p,buc,u,difLineaPedido);
                
                p.setVisible(true);
                }
                //si es vacio, es porque lo que tengo es mayor a lo que se necesita
                else{
                    //aca cambio de estado directamente, de todos los pedidos de producto a finalizado
                    
                    for(int i=0;i<lstPedidoProducto.size();i++){
                        lstPedidoProducto.get(i).setEstado(FINALIZADO); 
                        ActualizarResultados(lstPedidoProducto);
                        
                        //falta actualizar la BD con esos estados <.<
                        m.guardarPedidoProducto(lstPedidoProducto.get(i));
                    }
                    
                
                }
        }
    }
    

    
    
    class listarPedidos implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e) {
            Date fechaIni=aceptarPedidoProductoView.getFechaIni();
            Date fechaFin=aceptarPedidoProductoView.getFechaFin();
            listarResultados(fechaIni,fechaFin);
        }
    }
    
    
     
    
    class activarListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            int sel=aceptarPedidoProductoView.getFilaSel();
            //if (sel!=-1){
                //if (aceptarPedidoProductoView.solicitarConfirmacion("¿Desea reactivar este usuario?")==0){                
                    Pedidoproducto u = lstPedidoProducto.get(sel);
                    u.setEstado(ESTADO_ACTIVO);
                    //m.guardarAlmacen(u);
                    //mantAlmacenView.mostrarAviso("Se reactivó el usuario con éxito");
                    //listarResultados();
                //}
            }
            //else{
             //mantAlmacenView.mostrarError("Debe seleccionar un usuario");   
            //}               
        //}        
    }
}
